package main

import "fmt"

/**
slice本身没有数据，是对array的一个视图
slice可以向后扩展，不可以向前扩展
s[i]不可以超越len(s)，向后库欧战不可以超越底层数组
*/
func updateSlice(s []int) {
	s[0] = 100
}

func main() {

	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8}

	fmt.Println("arr[2:6] = ", arr[2:6])
	fmt.Println("arr[:6] = ", arr[:6])
	s1 := arr[2:]
	fmt.Println("arr[2:] = ", s1)
	s2 := arr[:]
	fmt.Println("arr[:] = ", s2)

	updateSlice(s1)
	fmt.Println("s1 = ", s1)

	updateSlice(s2)
	fmt.Println("s2 = ", s2)

	s2 = s2[:5]
	fmt.Println("s2 = ", s2)

	s2 = s2[2:]
	fmt.Println("s2 = ", s2)

	s3 := arr[2:6]
	s4 := s3[3:5]

	fmt.Printf("s3 = %v, len(s3) = %d, cap(s3)=%d \n", s3, len(s3), cap(s3))
	fmt.Printf("s4 = %v, len(s4) = %d, cap(s4)=%d \n", s4, len(s4), cap(s4))

	/**
	添加元素时如果超越cap，系统会重新分配更大的底层数组，
	由于值传递的关系，必须接受append的返回值
	s = append(s,val)
	*/
	s5 := append(s3, 10)
	s6 := append(s5, 11)
	s7 := append(s6, 12)

	fmt.Println(s5)
	fmt.Println(s6)
	fmt.Println(s7)
	fmt.Println(s3)
	fmt.Println(arr)

}
